/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.egojit.easyweb.log.web.utils;

import com.egojit.easyweb.common.Exceptions;
import com.egojit.easyweb.common.utils.SpringContextHolder;
import com.egojit.easyweb.common.utils.StringUtils;
import com.egojit.easyweb.log.model.SysLog;
import com.egojit.easyweb.log.service.SysLogService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * 日志工具
 *
 * @author Egojit
 * @version 2015-11-7
 */
public class LogUtils {

    public static final String CACHE_MENU_NAME_PATH_MAP = "menuNamePathMap";

    private static SysLogService logService = SpringContextHolder.getBean(SysLogService.class);

    /**
     * 保存日志
     */
    public static void saveLog(HttpServletRequest request, SysLog log) {
        saveLog(request, null, null, log);
    }

    /**
     * 保存日志
     */
    public static void saveLog(HttpServletRequest request, Object handler, Exception ex, SysLog log) {
//        SysLog log = new SysLog();
        log.setType(ex == null ? SysLog.TYPE_ACCESS : SysLog.TYPE_EXCEPTION);
        log.setRemoteAddr(StringUtils.getRemoteAddr(request));
        String str = request.getParameter("userName");
        if (!StringUtils.isEmpty(str)) {
            log.setCreateBy(str);
        }
        log.setUserAgent(request.getHeader("user-agent"));
        log.setRequestUri(request.getRequestURI());
        log.setParams(request.getParameterMap());
        log.setMethod(request.getMethod());
        // 异步保存日志
        new SaveLogThread(log, handler, ex).start();
    }

    /**
     * 保存日志线程
     */
    public static class SaveLogThread extends Thread {

        private SysLog log;
        private Object handler;
        private Exception ex;

        public SaveLogThread(SysLog log, Object handler, Exception ex) {
            super(SaveLogThread.class.getSimpleName());
            this.log = log;
            this.handler = handler;
            this.ex = ex;
        }

        @Override
        public void run() {
            // 获取日志标题
            if (StringUtils.isBlank(log.getTitle())) {
                String permission = "";
                if (handler instanceof HandlerMethod) {
                    Method m = ((HandlerMethod) handler).getMethod();
                    RequiresPermissions rp = m.getAnnotation(RequiresPermissions.class);
                    permission = (rp != null ? StringUtils.join(rp.value(), ",") : "");
                }
            }
            // 如果有异常，设置异常信息
            log.setException(Exceptions.getStackTraceAsString(ex));
            // 如果无标题并无异常日志，则不保存信息
            if (StringUtils.isBlank(log.getTitle()) && StringUtils.isBlank(log.getException())) {
                return;
            }
            logService.insert(log);
        }
    }

    /**
     * 获取菜单名称路径（如：系统设置-机构用户-用户管理-编辑）
     */
//	public static String getMenuNamePath(String requestUri, String permission){
//		String href = requestUri;//StringUtils.substringAfter(requestUri, Global.getAdminPath());
//		@SuppressWarnings("unchecked")
//		Map<String, String> menuMap = (Map<String, String>) CacheUtils.get(CACHE_MENU_NAME_PATH_MAP);
//		if (menuMap == null){
//			menuMap = Maps.newHashMap();
//			List<Menu> menuList = menuDao.findAllList(new Menu());
//			for (Menu menu : menuList){
//				// 获取菜单名称路径（如：系统设置-机构用户-用户管理-编辑）
//				String namePath = "";
//				if (menu.getParentIds() != null){
//					List<String> namePathList = Lists.newArrayList();
//					for (String id : StringUtils.split(menu.getParentIds(), ",")){
//						if (Menu.getRootId().equals(id)){
//							continue; // 过滤跟节点
//						}
//						for (Menu m : menuList){
//							if (m.getId().equals(id)){
//								namePathList.add(m.getName());
//								break;
//							}
//						}
//					}
//					namePathList.add(menu.getName());
//					namePath = StringUtils.join(namePathList, "-");
//				}
//				// 设置菜单名称路径
//				if (StringUtils.isNotBlank(menu.getHref())){
//					menuMap.put(menu.getHref(), namePath);
//				}else if (StringUtils.isNotBlank(menu.getPermission())){
//					for (String p : StringUtils.split(menu.getPermission())){
//						menuMap.put(p, namePath);
//					}
//				}
//
//			}
//			CacheUtils.put(CACHE_MENU_NAME_PATH_MAP, menuMap);
//		}
//		String menuNamePath = menuMap.get(href);
//		if (menuNamePath == null){
//			for (String p : StringUtils.split(permission)){
//				menuNamePath = menuMap.get(p);
//				if (StringUtils.isNotBlank(menuNamePath)){
//					break;
//				}
//			}
//			if (menuNamePath == null){
//				return "";
//			}
//		}
//		return menuNamePath;
//	}


}
